package com.qianfeng.nio;

//
//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O/ = /O  
//                        ____/`---'/____  
//                      .   ' //| |// `.  
//                       / //||| : |||// /  
//                     / _||||| -:- |||||- /  
//                       | | /// - /// | |  
//                     | /_| ''/---/'' | |  
//                      / .-/__ `-` ___/-. /  
//                   ___`. .' /--.--/ `. . __  
//                ."" '< `.___/_<|>_/___.' >'"".  
//               | | : `- /`.;`/ _ /`;.`/ - ` : | |  
//                 / / `-. /_ __/ /__ _/ .-` / /  
//         ======`-.____`-.___/_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖镇楼                  BUG辟易  
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//  


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * Created by Jackiechan on 2022/7/4 11:00
 *
 * @author Jackiechan
 * @version 1.0
 * @since 1.0
 */
public class Nio04 {
    public static void main(String[] args) throws Exception {
        //我们要把gz.txt中的数据写入到xiaomei.txt
        FileInputStream fileInputStream = new FileInputStream("gz.txt");
        FileChannel fileInputStreamChannel = fileInputStream.getChannel();
        //目标文件
        FileOutputStream fileOutputStream = new FileOutputStream("xiaomei.txt");
        FileChannel fileOutputStreamChannel = fileOutputStream.getChannel();
        //创建bytebuffer
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        while (true) {
            //如果返回-1代表读完了
            byteBuffer.clear();//不执行这个的话,因为上次循环读取过数据,最终position会等于limit,那下面再read的时候会认为没有空间,会返回0,并不是-1
            //下次循环仍旧如此,一直无限循环下去,导致文件大小急剧膨胀
            //如果没有上面的clear,这里会返回0,并不是返回-1,因为内部会认为byteBuffer没有空间了,position会等于limit,所以会跳过if,然后继续翻转buffer,再写到文件,因为会无限循环
            int read = fileInputStreamChannel.read(byteBuffer);
            if (read == -1) {
                break;
            }
            //读完写入到文件里面
            //翻转
            byteBuffer.flip();
            fileOutputStreamChannel.write(byteBuffer);
        }
        fileInputStream.close();
        fileOutputStream.close();
    }
}
